package offical.coroutine

import kotlinx.coroutines.*

/**
 * 取消和超时
 */

//fun main() = runBlocking {
//    val job = launch {
//        repeat(1000) { i ->
//            println("job: I'm sleeping $i ...")
//            delay(500L)
//        }
//    }
//    delay(1300L) // 延迟一段时间
//    println("main: I'm tired of waiting!")
////    job.cancel() // 取消该作业
////    job.join() // 等待作业执行结束
//    job.cancelAndJoin()
//    println("main: Now I can quit.")
//}

//fun main() = runBlocking {
//    val startTime = System.currentTimeMillis()
//    val job = launch(Dispatchers.Default) {
//        //如果协程正在执行计算任务，并且没有检查取消的话，那么它是不能被取消的
//        var nextPrintTime = startTime
//        var i = 0
////        while (i < 8) { // 一个执行计算的循环，只是为了占用 CPU
////            // 每秒打印消息两次
////            if (System.currentTimeMillis() >= nextPrintTime) {
////                println("job: I'm sleeping ${i++} ...")
////                nextPrintTime += 500L
////            }
////        }
//
//        //isActive 是一个可以被使用在 CoroutineScope 中的扩展属性.可以控制计算是否可以被取消
//        while (isActive) { // 可以被取消的计算循环
//            // 每秒打印消息两次
//            if (System.currentTimeMillis() >= nextPrintTime) {
//                println("job: I'm sleeping ${i++} ...")
//                nextPrintTime += 500L
//            }
//        }
//
//    }
//    delay(1300L) // 等待一段时间
//    println("main: I'm tired of waiting!")
//    job.cancelAndJoin() // 取消一个作业并且等待它结束
//    println("main: Now I can quit.")
//}

fun main() = runBlocking {
    //超时取消会报异常TimeoutCancellationException
//    withTimeout(1300L) {
    val result = withTimeoutOrNull(1300L){
        repeat(1000) {i->
            println("print $i")
            delay(500L)
        }
        "Done" // 在它运行得到结果之前取消它
    }
    println("this result is $result")
}
